package bme.andraskindler.treenventory.provider;

import java.util.List;

import org.opencv.core.Mat;

import bme.andraskindler.treenventory.model.CameraData;
import bme.andraskindler.treenventory.model.TreeData;
import bme.andraskindler.treenventory.model.TypeData;

import com.activeandroid.query.Select;


public class TreenventoryDataSource {
	
	private static int id = 2;

	/**
	 * Fa mentése.
	 * @param data - a menteni kívánt fa.
	 */
	public static void persistTree(final TreeData data) {
		id++;
		data.setTreeid(id);
		data.save();
	}

	/**
	 * Fa törlése.
	 * @param data - a törölni kívánt fa.
	 */
	public static void deleteTree(final TreeData data) {
		data.delete();
	}

	/**
	 * Az összes fa lekérése.
	 * @return
	 */
	public static List<TreeData> getAllTrees() {
		return new Select().from(TreeData.class).execute();
	}

	/**
	 * Fatípus mentése.
	 * @param type - a menteni kívánt fatípus.
	 */
	public static void persistType(final TypeData type) {
		type.save();
	}

	/**
	 * Fatípus törlése.
	 * @param type - a törölni kívánt fatípus.
	 */
	public static void deleteType(final TypeData type) {
		type.delete();
	}

	/**
	 * Az összes fatípus listázása.
	 * @param sortHungarian - magyar név szerint rendezés; ha hamis, a latin név szerint rendez.
	 * @return
	 */
	public static List<TypeData> getAllTypes(boolean sortHungarian) {
		if (sortHungarian)
			return new Select().from(TypeData.class).orderBy("hungarianname ASC").execute();
		else
			return new Select().from(TypeData.class).orderBy("latinname ASC").execute();
	}

	/**
	 * Név alapú keresés
	 * @param name - típusnév.
	 * @param sortHungarian - magyar név szerint rendezés; ha hamis, a latin név szerint rendez.
	 * @return
	 */
	public static List<TypeData> getTypeForName(String name, boolean sortHungarian) {
		return new Select().from(TypeData.class).where("hungarianname LIKE \'?\' ", name).orderBy("hungarianname ASC").execute();
	}

	/**
	 * A kamera paramétereinek és a torzízásmátrix mentése.
	 * @param camera
	 * @param distCoeffs
	 */
	public static void setCameraParams(Mat camera, Mat distCoeffs) {
		List<CameraData> old = new Select().from(CameraData.class).execute();
		for (CameraData cameraData : old) {
			cameraData.delete();
		}
		CameraData data = new CameraData();
		data.setCamera(camera);
		data.setDist(distCoeffs);
		data.save();
	}

	/**
	 * A kamera paramétereinek és a torzításmátrix lekérése
	 * @return
	 */
	public static CameraData getCameraParams() {
		return new Select().from(CameraData.class).executeSingle();
	}

}
